One ground, six colours, three faces, and a masthead that never changes.
01 / Foundation
Thorne Syndicate runs two registers on one skeleton and flips the ground between them. LightSpeed does the opposite on purpose. There is one ground, one light, and one set of rules. What varies is colour.
A holding company that owns an agricultural business, a health device business and a software business has no single subject. Thorne solves that by flipping dark and light. LightSpeed solves it by giving every part of the group a colour and never moving the ground. Northbeam is teal wherever it appears. Kestrel is amber. Vela is terracotta. A reader who has seen two pages can read the third without a legend.
The practical consequence: never invert a LightSpeed page. There is no dark variant. A page that needs to feel serious gets less colour, not a darker ground.
The reference was a desk covered in printed infographic sheets — pale paper, thin connector lines, circular icon badges, donut charts, and a palette of petrol blue, sage, amber and terracotta. Everything in this guide is an attempt to make a screen behave like that desk: matte, generous, colourful without shouting.
LightSpeed is international, and nothing it publishes should say where it lives. No head-office address, no home currency, no national holidays, no "our region". A reader in Chicago and a reader in Manchester should both find it unremarkable.
Spelling follows American usage — license, not licence — while the prose register stays neutral.
| Thorne Syndicate | LightSpeed Holdings | |
|---|---|---|
| Ground | Flips. Anvil dark, or cast concrete | Never flips. Paper |
| Cut | The chamfer. 45°, never rounded | The soft radius. 14px on cards |
| Accent | One. Bronze, graphic use only | Six. Each one owns a subject |
| Display type | Oswald. Condensed, industrial | Outfit. Geometric, open |
| Photography | Architecture, no people, low light | Interiors and objects, high key |
| Feeling | A foundry at night | A studio at nine in the morning |
02 / The mark
Light through a prism, reduced until it survives at sixteen pixels. Three chevrons, left to right, in teal, amber and terracotta. Nothing else.
The chevrons are drawn as three separate open paths, each 6.5 units wide on a 48-unit artboard, with round caps and round joins. They overlap deliberately: the gap between them is smaller than a chevron arm, so at small sizes they read as one accelerating shape rather than three separate arrows.
03 / Colour
The palette is not decoration. Every colour is assigned to a subject and holds that assignment across every page in the group. If teal appears, it is Northbeam or it is technology. It is never just “the blue one”.
| Colour | Hex | Owns | Second use |
|---|
Paper is the only ground. Card is the only surface. Nothing else is a background.
The first treemap build put white text on amber and on sage. It was unreadable, and it shipped in a screenshot before anyone noticed. The rule now:
#737E8B with a comment claiming 4.8:1 against Paper. It measured
3.78:1 — below the 4.5 needed for normal text. It is now
#66717D at 4.53. The up and down greens and reds were 3.13 and 3.97 and
are now 4.5 or better. A Codex pass caught all threeThe same rule governs chips, pills, funnel bars and treemap cells. It is carried in code as a
single lt flag on the colour, not judged per component.
04 / Type
Outfit for anything that is a name. Inter for anything that is a sentence. IBM Plex Mono for anything that is a number, a label, or a path.
Every figure in the system carries font-variant-numeric: tabular-nums.
A number that changes while you watch it — a live counter, a mark-to-market value, a clock
— must not shift the characters around it. This is the single most common thing to forget
and the most obvious when it is wrong.
05 / The cut
Thorne has the chamfer. LightSpeed has the radius. Four values, applied by role, never chosen by eye.
Nothing is square. A zero radius reads as an error in this system, the same way a rounded corner reads as an error in Thorne.
06 / The masthead
Every artifact opens with the same five elements in the same order at the same sizes. Change the words. Never change the anatomy.
One sentence. What this page is, and who it is for. Never two sentences.
lite.html on every page07 / The fold
These pages are photographed. A screenshot captures roughly the first screen and nothing else, so the first screen has to carry the whole argument.
Two rules follow, and they are as much a part of this brand as the palette.
A deep masthead eats the screen, and the cut falls through the middle of a row of cards. The screenshot shows a headline and four half-cards.
A shallow masthead, then the graphic sized to exactly the room left. The cut lands on the card’s own edge, at half screen and at full screen alike.
The lead block carries data-lead (how many pixels of content sit
between it and the fold) and data-max (a ceiling, so a tall display does not
produce an absurd hero). A script sets its height to
innerHeight − itsTop − tail − 16, capped. An empty
.foldstop element after it takes whatever viewport is left, which pushes the next
section onto the second screen.
It re-runs on resize, on load, and after
document.fonts.ready. Bind those as function(){fitFold()}, never as
the bare function — see section 11.
A screenshot that slices a row of cards in half looks broken. A screenshot that stops mid-paragraph looks like a page of writing, which is what it is. So the Annual Letter carries no fold spacer at all: forcing a break there would push the first chapter off a screen with room for it, and buy nothing.
Size the lead block with a minimum height, never a fixed one. A fixed
height plus overflow:hidden clips content that grows — which is exactly
how the letter lost its dateline. See section 14.
A set of samples whose first screens all look the same is one sample shown six times. Each page in the group leads with a different kind of graphic:
| Page | Leads with |
|---|---|
| 01 Travel | A photograph beside an animated route map |
| 02 Portfolio | A treemap, sized by position value |
| 03 Briefings | A wall of eight small charts |
| 04 Revenue | A three-series line chart |
| 05 Digital | Stacked columns beside a real-time panel |
| 06 Content | A month grid in colour |
| 00 Brand | The mark and the palette, as a specimen |
08 / Charts
Every chart in this group is hand-built SVG. No chart library, no CDN, no network call except the web font. A page has to open correctly on a laptop with no internet in an airport.
09 / Motion
Motion in this system does one of two jobs: it shows a value arriving, or it shows that something is live. Anything else is noise.
The gallery snapshots a page for its card long before any timer has run. A
first screen staged at opacity: 0 and faded in by script is a blank card, and a
blank card makes the app look broken even though the page is perfect. Six of these eleven
pages thumbnailed as a masthead and nothing else until this rule existed.
The Meeting Room Display was the one page that always thumbnailed correctly, and it is the one page that never faded anything in.
A control that navigates somewhere should be able to say where, before it is pressed. The deck's next and previous buttons preview the slide they lead to, and the progress bar previews any slide you point at. The delays are deliberate:
| Situation | Delay | Why |
|---|---|---|
| First hover on a control | 400 ms | Long enough that a pointer crossing the control never flashes a tip; short enough that anyone who paused to ask gets an answer without waiting |
| Moving to a neighbouring control | 0 ms | Once one tip is open the group is warm. Two buttons side by side should not feel like two separate waits |
| Group cools down after leaving | 300 ms | Long enough to cross a gap between controls, short enough that a later hover feels like a fresh question |
| Scrubbing along the progress bar | 0 ms | Here the pointer is the question, as on a video timeline. Any delay reads as lag |
| Hiding | 0 ms | A tip that lingers after the pointer has gone is in the way |
A title slide is on screen while somebody introduces themselves, which is longer than any other slide in the deck. It is the one place where a still page reads as a dead page, and the one real advantage this format has over a PDF. It carries three loops, none of which should be noticeable on their own:
It is one gesture, and it runs left to right across the whole slide. Not several loops running at once — a single nine-second pass that hands off from one element to the next, then rests for five seconds.
| Slot | What happens |
|---|---|
| 0 – 2.0s | A soft highlight crosses the six-colour rule beneath the title, left to right, and leaves |
| 2.0 – 3.8s | It hands off to the mark. Each chevron dims to 42% and returns, one after another, half a second apart |
| 1.8 – 4.0s | Underneath that, the mark eases 2.8% to the right and grows 4%, then settles back |
| 4.0 – 9.0s | Nothing. The rest is as much a part of it as the movement |
Because the chevrons point the way the deck advances, the sweep says forward as well as saying the company’s name. The rule bar is set to exactly the width of the title so the pass reads as one straight line, and the mark sits centred in the space between the title and the edge of the page.
Behind all of it, two washes drift — teal and amber at 13% alpha, 38 and 46 seconds, out of phase — so the frame is never quite static even during the rest.
One gesture, not several. An earlier version also pulsed the small corner mark and drew an underline beneath the date. With three things moving, none of them read as intentional. The corner mark now drops its icon on this slide entirely — the wordmark alone is enough, and the logo should appear at full size once, not three times on one screen.
Nothing on a title slide may move fast, bounce, or repeat on a cycle shorter than four seconds. If a viewer can time the loop, it is too quick. And every keyframe begins at full opacity, so the gallery thumbnail is never caught mid-fade.
Arrivals use cubic-bezier(.22, 1, .36, 1) — fast out, long
settle. Counters use a cubic ease-out in script. There is no bounce anywhere in the system,
and nothing loops except the live dot and the flight paths.
Every looping animation stops for reduced motion. Every page in this
group carries a prefers-reduced-motion: reduce block that cancels the loops and
leaves the finished state on screen. A drawn line ends drawn; an underline ends underlined.
Navigation runs off intent, never off measured position. Asking the scroll container "where am I" during an animation answers with the slide you just left, so a fast run of clicks appears to do nothing. The position advances the instant a click lands; the scroll listener only re-syncs when the user scrolls by hand. See section 14.
Every animated number must settle. A counter that is still climbing when the screenshot is taken is a broken screenshot. Each one force-writes its final value after 1.8 seconds regardless of what the animation frame is doing.
10 / Photography
The photography is the other half of the light register. Bright, matte, generous with empty space, and always a little cooler than the palette so the colour stays the loudest thing on the page.
These are generated, and the phrasing matters more than the tool. The working grammar, with the load-bearing phrases in bold:
Delivered as JPEG, longest edge 1400px, quality 80, then embedded in the page as a data URI so the file stays a single portable artifact.
11 / Wired into Lite
Every page declares its preset and accent so lite.computer can theme its chrome to match the artifact.
| Path | Holds |
|---|---|
lite.html | The front door. Six rooms and the palette strip |
lite.theme.css | The tokens, for the workspace shell |
00 Brand/ | This guide, and the photography library |
01–06 | One folder per artifact family |
Files are named Subject-Words-Hyphenated.html inside a numbered folder. Every page
is self-contained: styles inline, images embedded, scripts inline. A page can be moved, emailed
or opened from a USB stick and still be correct.
12 / The display register
A slide and a wall sign are not read at a desk. They are read from the back of a room or from a corridor. They keep the palette, the type and the radius, and drop everything else the document register carries.
| Document register | Display register | |
|---|---|---|
| Used by | Reports, letters, dashboards | Slides, signage, wall boards |
| Header | The full masthead, section 06 | Mark and one name. Nothing else |
| Breadcrumb | Always | Never |
| Standfirst | Always, one line | Never |
| Margins | Paper ground, 1180px measure | Full bleed, edge to edge |
| Type scale | Fixed pixels | Sized in vmin, so it scales |
| The fold | Applies. See section 07 | Does not. The page is the screen |
| Scroll | Yes | Slides snap. Signs never scroll |
A wall sign has to be right on a ten-inch door tablet and on a
twenty-seven-inch panel, and a slide has to be right in a window and on a projector. Fixed
pixel type cannot do both. Everything in the display register is sized against
vmin, so the whole composition scales as one thing instead of reflowing.
Signs also carry a landscape rule: past a 1:1 aspect ratio the layout moves to two columns rather than letting content run off the bottom. A sign that overflows is a sign that lies.
Signage is read in presentation mode — no chrome, no comment bar, nothing around it. With no frame it bleeds into the display and stops reading as an object on a wall. So the panel sits inset from the screen on a slightly darker ground, with a hairline border, a 2.4vmin radius and one soft shadow. It should look like a plaque someone mounted, not like a web page filling a monitor.
17:54 ticking down reads as alive, and it is the cheapest
possible proof that the panel is still connected| Piece | Behaviour |
|---|---|
| Q3 Board Deck | Twelve full-bleed slides. Arrow keys advance it; scrolling reads it as a document. Scroll snapping does both jobs from one implementation |
| Meeting Room Display | Portrait. A status band that washes sage, amber or terracotta as the room frees itself, and three analogue faces on real time |
| Annual Letter | Document register, but reading-first: one column, a 62-character measure, drawn illustrations rather than photographs |
13 / A page that answers back
One page in this group recomputes as you drag it. That is a different promise from a chart, and it carries its own rules.
Sensitivity grids get their own five-step scale, and it is the only place in the system where colour encodes a magnitude rather than a subject: Terracotta below 10%, Amber to the 18% hurdle, Sage to 26%, Teal to 34%, Petrol above. The cell matching the current controls carries a Graphite outline so the reader can see where they are standing.
14 / What the build got wrong
Recorded because each one shipped, each one was caught by looking at a rendered page rather than at the code, and each one will happen again to whoever builds the next set.
The first treemap used white labels on every cell, including amber and sage.
Unreadable. Contrast is now decided once per colour by an lt flag, not judged
per component. Section 03.
addEventListener('resize', fitFold) passes the Event as the
function’s first argument. That argument was a callback, so calling it threw, and the
fold spacer silently never got its height on three pages. Always bind as
function(){fitFold()}.
A counter started from performance.now() but measured progress
against the animation-frame timestamp. When the two disagreed, progress went negative, the
easing curve inverted, and a live “visitors on site” readout showed 148,783 people.
Take the start time from the first frame, and clamp progress to zero and one.
The quota bars in Sales Performance were <span> elements.
Inline elements ignore height and width, so the whole Attainment column rendered as empty
space. It was invisible in the code and obvious in a screenshot.
The fold script set an exact pixel height on the lead block. When the Annual
Letter’s opening grew by one contents list, the extra content was clipped — off the
top, because the block was centred. The dateline vanished and nothing errored.
Size with min-height: it does the same job and cannot cut.
The first set of spot illustrations were hand-authored SVG paths. They were on-palette, correct, and not good enough to print. Drawing by hand in code is the right instinct for a chart and the wrong one for an illustration.
Every one of these passed a read-through of the source and failed the moment the page was actually rendered and looked at. Two of them were invisible even then until someone opened the page at a different window size. Screenshot the thing, at more than one size.